package com.tianbao54.kotlin_01

// 扩展 extension
class ExtensionTest {

    fun add(a: Int, b: Int) = a + b
    fun subTrack (a: Int , b: Int): Int = a - b
}

fun ExtensionTest.multiply (a:Int,b:Int) = a * b

// 扩展函数解析是静态的
/**
 * 1.扩展本身不会去修改目标类，也就是说他不会在目标类中插入新的方法
 * 2.扩展函数是静态分发的，而不是动态的，既不支持多态。调用只取决于对象声明
 */
fun main(args: Array<String>) {

    var extensionTest = ExtensionTest()
    println("add : ${extensionTest.add(3 ,5)}")
    println("sub : ${extensionTest.subTrack(5,3)}")
    println("multiply : ${extensionTest.multiply(3,5)}")

    myPrintln(BB())
    var cc = CC()
    cc.foo(1)
}

open class AA

class BB:AA()

fun AA.a() = "a"
fun BB.a() = "b"
// 由于 声明的是 AA ，所以不管传入的是哪个子类，调用的都是 aa 的 a 方法
fun myPrintln (aa:AA) {
    println("aa = ${aa.a()}")
}

class CC {
    fun foo () {
        println("member")
    }
}

fun CC.foo () {
    println("member2")
}

fun CC.foo (i:Int) {
    println("member2")
}

// 可空类型扩展
fun Any?.toString(): String {
    if (null == this) {
        return "null"
    }
    return toString()
}